﻿using System;
using System.Runtime.Serialization;

namespace Loki.Utils
{
    /// <summary>
    /// Weak null reference.
    /// </summary>
    /// <typeparam name="T">Type reference.</typeparam>
    [Serializable]
    public class WeakNullReference<T> : WeakReference<T> where T : class
    {
        /// <summary>
        /// Gets weak null reference singleton.
        /// </summary>
        public static WeakNullReference<T> Value
        {
            get
            {
                return _Value.Value;
            }
        }

        private static Lazy<WeakNullReference<T>> _Value = new Lazy<WeakNullReference<T>>();

        /// <summary>
        /// Prevents a default instance of the <see cref="WeakNullReference&lt;T&gt;"/> class from being created.
        /// </summary>
        private WeakNullReference()
            : base(null)
        {
        }

        /// <summary>
        /// Obtient une indication permettant de savoir si l'objet référencé par l'objet <see cref="T:System.WeakReference"/> a été récupéré par le garbage collector.
        /// </summary>
        /// <returns>Returns true si l'objet référencé par l'objet <see cref="T:System.WeakReference"/> actuel n'a pas été récupéré par le garbage collector et est toujours accessible ; sinon, false.</returns>
        public override bool IsAlive
        {
            get { return true; }
        }

        protected WeakNullReference(SerializationInfo P_Info, StreamingContext P_Context)
            : base(P_Info, P_Context)
        {
        }
    }
}
